<?php
	class Atividade {
		public $idAtividade = NULL;
		public $idCurso;
		public $titulo;
		public $dataInicio;
		public $tempo;
		public $numArquivos;
		public $dataTermino;
		public $tipoAtividade;
		public $emGrupo;
		public $darNota;
		public $peso;
		public $valor;
		public $duracao;
		public $dataHoraInsercao;
		public $idUsuario;
		public $dataHoraUltimaModificacao;
		public $idUsuarioUltimaModificacao;
    
		public $status = null;
		public $periodo = null;
		public $nota = null;
    
		public $corrigivel = false;
    
		public $numCorrigidas = 0; //numero de atividades que ja foram totalmente corrigidas
		public $numFeitas = 0; //numero de alunos que ja fizeram
    
		public $idUsrLogado;
		
		public $listaPerguntas = null;
		
		public $versoes = null;
    
		//END VARIAVEIS
		
		public function Atividade($id, $idUsrLogado) {
			if(is_numeric($id)){
				
				$arrParams = BancoDados::queryArray("SELECT * FROM atividades WHERE idAtividade = $id");
				
				if(!is_array($arrParams)) return false; //se foi passado id mas não vem nada do banco retorna false
			}
			if(isset($arrParams)){
				extract($arrParams);
				//versoes já entregues de cada atividade
				
				$this->idAtividade = $idAtividade;
				$this->idCurso = $idCurso;
				$this->titulo = $titulo;
				$this->dataInicio = $dataInicio;
				$this->dataTermino = $dataTermino;
				$this->tipoAtividade = $tipoAtividade;
				$this->emGrupo = $emGrupo;
				$this->darNota = $darNota;
				$this->tempo = $tempo*60;
				$this->numArquivos = $numArquivos;
				$this->peso = $peso;
				$this->valor = $valor;
				$this->duracao = $duracao;
				$this->dataHoraInsercao = $dataHoraInsercao;
				$this->idUsuario = $idUsuario;
				$this->dataHoraUltimaModificacao = $dataHoraUltimaModificacao;
				$this->idUsuarioUltimaModificacao = $idUsuarioUltimaModificacao;
				
				$this->listaPerguntas = AtividadePergunta::getTodasPerguntasAtividade($idAtividade,'objeto');
				$this->versoes = AtividadeVersao::getTodasVersoesAtividade($idAtividade,'objeto');
		      
				//define se é do tipo corrigivel - aqui estou assumindo esses valores
				if($this->tipoAtividade == 'questionario') $this->corrigivel = true;        
				else if($this->tipoAtividade == 'teste') $this->corrigivel = true;
				else if($this->tipoAtividade == 'orientacao') $this->corrigivel = false;
				else if($this->tipoAtividade == 'envio') $this->corrigivel = false;
				else if($this->tipoAtividade == 'envioMultiplo') $this->corrigivel = false;
				else if($this->tipoAtividade == 'wiki') $this->corrigivel = false;
				
				//testa qual é a situação da atividade (em que período ela está)
				$agora = BancoDados::getData();
				if(strcmp($agora, $this->dataTermino) > 0) $this->periodo = texto('DADOS_ENCERRADA');
				elseif(strcmp($agora, $this->dataInicio) < 0) $this->periodo = texto('DADOS_FECHADA');
				else $this->periodo = texto('DADOS_ABERTA');
				
				if($fezAtividade = AtividadeVersao::getUltimaVersaoAluno($idAtividade, $idUsrLogado)){
					if($fezAtividade->enviado == 1){
						$this->status = texto('DADOS_ENVIADA');
					}else{
						$this->status = texto('DADOS_INICIADA');
					}
				}else{
					$this->status = texto('DADOS_PENDENTE');
				
				}
		      
			  	//TODO_done checar se a atividade é do tipo com nota e puxa-la do banco
				if($this->darNota) { //se é corrigivel suponho que tenha nota..
					if(count($this->versoes) != 0){
						$entregou = false;
						foreach($this->versoes as $indice => $conteudo){
							if($conteudo->idUsuario == $idUsrLogado){
								$this->nota = $conteudo->nota;
								$entregou = true;
							}
						}
						if(!$entregou){
							$this->nota = '--';
						}
					}else{
						$this->nota = '--';
					}
				}
			  
				//TODO_done baixar status de correção das atividades
				//TODO_done corrigir isso pra não contar mais de uma vez o mesmo cara!
				$this->numCorrigidas = 0;
				$this->numFeitas = 0;
				if(isset($this->versoes)){
					$alunosContados = array();
					foreach($this->versoes as $indice => $conteudo){
						if(!isset($alunosContados[$conteudo->idUsuario])){
							$alunosContados[$conteudo->idUsuario] = true;
							if($conteudo->corrigido == 1 && ($conteudo->lancado == 1 || $this->tipoAtividade == 'envio' || $this->tipoAtividade == 'envioMultiplo')){
								$this->numCorrigidas++;
							}
							if($conteudo->enviado == 1){
								$this->numFeitas++;
							}
						}
					}
				}
			}
		}
		/** 
	     * Retorna vetor com instancias de Atividades dentro do curso no parametro 
	     */
		public static function getLista($idCurso, $idUsrLogado) {
			//TODO alterar esse metodo + construtor para não ficar fazendo bilhoes de querys!!
			
			$resultMatrix = BancoDados::query("SELECT * FROM atividades WHERE idCurso = $idCurso");
			if(!empty($resultMatrix)){
				foreach($resultMatrix as $i => $conteudo){
					$lista[$i] = new Atividade($conteudo['idAtividade'], $idUsrLogado);
				}
				return $lista; //retorna lista de instancias de uma atividade
			} 
			else return null;			
		}
		
		public static function getListaParaCurso($idCurso) {
			$resultMatrix = BancoDados::query("SELECT idAtividade as idItem ,idCurso, idUsuario, titulo FROM atividades WHERE idCurso = $idCurso");
			if(!empty($resultMatrix)){
				return $resultMatrix; //retorna lista de instancias de uma atividade
			} 
			else return null;
		}
		
		public function inserir(){ //'insira-se'
			if($this->validar()){//valide-se
				$srtQuery = "INSERT INTO atividades VALUES(DEFAULT, $this->idCurso, '$this->titulo', '$this->dataInicio','$this->dataTermino','$this->tipoAtividade','$this->emGrupo','$this->darNota','$this->peso',null,'$this->dataHoraInsercao','$this->idUsuario','$this->dataHoraUltimaModificacao','$this->idUsuarioUltimaModificacao',$this->valor, '$this->tempo', '$this->numArquivos' )";
				if(BancoDados::query($srtQuery)){
					$srtQuery1 = "SELECT idAtividade FROM atividades WHERE idCurso = $this->idCurso AND titulo= '$this->titulo' AND dataInicio = '$this->dataInicio' AND dataTermino = '$this->dataTermino' AND tipoAtividade = '$this->tipoAtividade' ORDER BY dataHoraInsercao DESC";
					if($resultado = BancoDados::query($srtQuery1)){
						atualizaCurso($this->idCurso);
						return $resultado[0][0];
					}			
				}else{
					return false;				
				}
				return true;
			}else{
				return false;
			}						
		}
		
		public function alterarBD(){ //'altere-se'
			if($this->idAtividade){
				if($this->validar()){
					$srtQuery = 
						"UPDATE atividades SET 
						titulo 			= '$this->titulo',
						dataInicio 		= '$this->dataInicio',
						dataTermino 	= '$this->dataTermino',
						tipoAtividade 	= '$this->tipoAtividade',
						emGrupo 		= '$this->emGrupo',
						darNota 		= '$this->darNota',
						peso 			= '$this->peso',
						valor 			= '$this->valor',
						tempo 			= '$this->tempo',
						numArquivos 	= '$this->numArquivos',
						dataHoraUltimaModificacao 	= NOW(),
						idUsuarioUltimaModificacao 	= '$this->idUsuarioUltimaModificacao'
						WHERE idAtividade = '$this->idAtividade';";
					if(BancoDados::query($srtQuery)){
						atualizaCurso($this->idCurso);
						return true;
					}
					else return false;
				}else{
					return false;
				}	
			}else{
				return false;
			}
		}
		
		public function apagar(){ //'apague-se'
			$apagado = true;
			$strQuery	=	"DELETE FROM associacoes WHERE (idElemento1 = " . $this->idAtividade . " AND elemento1 = \"atividades\") OR (idElemento2 = " . $this->idAtividade . " AND elemento2 = \"atividades\")";
			if(BancoDados::query($strQuery)) {
				$strQuery1	=	"DELETE FROM atividades WHERE idAtividade = $this->idAtividade";
				if(BancoDados::query($strQuery1)){
					if($this->listaPerguntas != null){
						foreach($this->listaPerguntas as $indice => $item){
							if(!$item->apagar()){
								$apagado = false;
							}
						}
					}
					if($this->versoes != null){
						foreach($this->versoes as $indice => $item){
							if(!$item->apagar()){
								$apagado = false;
							}
						}
					}
				}
			}
			return $apagado;
		}
		
		//que feio senhor gabriel! -qualquer atitude que o sistema vá tomar com relação ao que deve fazer em caso de erro de validaçao
		//deve ser tomada pelo controller, cabendo ao modelo somente informar quais são estes.
		public function validar(){ //'valide-se'
			$validou	=	true;
			
			if (!validaAlfaNumerico($this->titulo, constant('__TAM_TITULO_AVISO__'))){
				$validou	=	false;
				adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_CAMPO_INPUT', array(texto('DADOS_NOME'))), 'erro');	
			}
			
			if (!validaDataString($this->dataInicio)){
				$validou	=	false;
				adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_CAMPO_INPUT', array(texto('DADOS_DATA_INICIO'))), 'erro');	
			}
			
			if (!validaDataString($this->dataTermino)){
				$validou	=	false;
				adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_CAMPO_INPUT', array(texto('DADOS_DATA_TERMINO'))), 'erro');	
			}
			
			if(strtotime($this->dataInicio)>strtotime($this->dataTermino)){
				$validou	=	false;
				adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_COMPARACAO_DATAS', array(texto('DADOS_INICIO'), texto('MAIOR_IGUAL'), texto('DADOS_TERMINO'))), 'erro');
			}
			
			if($this->tipoAtividade == "Selecione o tipo de atividade"){
				$validou	=	false;
				adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_CAMPO_SELECT',array(texto('DADOS_TIPO'))), 'erro');
			}
			if($this->darNota){
				if (!validaNumero($this->peso)){
					$validou	=	false;
					adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_CAMPO_INPUT', array(texto('DADOS_PESO'))), 'erro');	
				}
				/*
				if (!validaNumero($this->valor)){
					$validou	=	false;
					adicionaMensagem(texto('MENSAGEM_ERRO_VALIDACAO_CAMPO_INPUT', array(texto('DADOS_VALOR'))), 'erro');	
				}
				*/
			}
			

			
			return $validou;
		}
		
		//retorna todas as variaveis de instancia como um array
		public function getEverithing(){
			$arr = get_object_vars($this);
      
			//ajusta datas para a exibição
			$arr['dataInicio'] = getDataFormatada($this->dataInicio);
			$arr['dataTermino'] = getDataFormatada($this->dataTermino);
			$arr['dataHoraUltimaModificacao'] = getDataHoraFormatada($this->dataHoraInsercao);
			$arr['dataHoraInsercao'] = getDataHoraFormatada($this->dataHoraUltimaModificacao);
      
			return $arr;
		}
		
		public function setEverithing($idCurso, $titulo, $dataInicio, $dataTermino, $tipoAtividade, $emGrupo, $darNota, $peso, $duracao, $dataHoraInsercao, $idUsuario, $dataHoraUltimaModificacao, $idUsuarioUltimaModificacao,$valor){
			$this->idAtividade = $idAtividade;
			$this->idCurso = $idCurso;
			$this->titulo = $titulo;
			$this->dataInicio = $dataInicio;
			$this->dataTermino = $dataTermino;
			$this->tipoAtividade = $tipoAtividade;
			$this->emGrupo = $emGrupo;
			$this->darNota = $darNota;
			$this->peso = $peso;
			$this->valor = $valor;
			$this->duracao = $duracao;
			$this->dataHoraInsercao = $dataHoraInsercao;
			$this->idUsuario = $idUsuario;
			$this->dataHoraUltimaModificacao = $dataHoraUltimaModificacao;
			$this->idUsuarioUltimaModificacao = $idUsuarioUltimaModificacao;
			atualizaCurso($this->idCurso);
		}
        
	    //TODO setNota (upar nota pro banco)
	    /**$listaPerguntas
	     * função que vai upar uma nova nota pro banco.
	     */    
		public function setNota($nota){
			if(is_numeric($nota)){ //se nao for numerico tem alguma coisa errada
				//$resultArray = BancoDados::queryArray("SELECT * FROM atividades WHERE idAtividade = $id");
				if($resultArray) {
					$this->nota = $nota;
					atualizaCurso($this->idCurso);  
				} else {atualizaCurso($this->idCurso);
					return false;
				}
			} else {
				return false;
			}
		}
		
		public function inserirPergunta($strTipo, $strDescricao, $strValor, $gabarito = NULL, $strIdPergunta = 0) {
			$pergunta = new AtividadePergunta(); // instanciando a classe pergunta
			
			//instanciado as variaveis da pergunta que eu vou inserir
			$pergunta->idAtividade	= $this->idAtividade;
			$pergunta->tipo 				= $strTipo;
			$pergunta->texto				= $strDescricao;
			if($this->darNota)
				$pergunta->valor			= $strValor;
			else
				$pergunta->valor			=	'0';
			
			$pergunta->identificador =  $strIdPergunta;
			$pergunta->gabarito = $gabarito == null ? null : $gabarito;
			
			if($this->tipoAtividade == 'questionario'){
				
				/*
				//loop para instanciar as alternativas da pergunta a ser inserida
				foreach($_POST as $indice => $valor){
					$alternativa = array();
					if (preg_match('/strAlternativa[0-9]/', $indice)){//comparo se tem algum post de strAlternativa
						if($_POST[$indice] != ''){
							$alternativa["alternativa"] = $_POST[$indice];
							$numero = str_replace('strAlternativa', '', $indice);//pego o indice da alternativa
							if(isset($_POST['chkAlternativa'.$numero])){//vejo se ele está com chkALternativa(resposta certa)
								$alternativa["correta"] = true;//se o if for satisfeito eu coloco no vetor alternativa o valor true
							}else{
								$alternativa["correta"] = 0;
							}
							array_push($pergunta->alternativas,$alternativa);
						}
					}
				}
				if(isset($_POST['verdadeiroFalso'])){
					if($_POST['verdadeiroFalso'] == "Falso"){
						$alternativa["alternativa"] = "Verdadeiro";
						$alternativa["correta"] = 0;
						array_push($pergunta->alternativas,$alternativa);
						$alternativa$listaPerguntas["alternativa"] = $_POST['verdadeiroFalso'];
						$alternativa["correta"] = true;
						array_push($pergunta->alternativas,$alternativa);
					}else{
						$alternativa["alternativa"] = $_POST['verdadeiroFalso'];
						$alternativa["correta"] = true;
						array_push($pergunta->alternativas,$alternativa);
						$alternativa["alternativa"] = "Falso";
						$alternativa["correta"] = 0;
						array_push($pergunta->alternativas,$alternativa);
					}
				}
				*/
			}
			
			if($pergunta->inserir()){
				array_push($this->listaPerguntas,$pergunta);
				atualizaCurso($this->idCurso);
				return true;
			} else 
				return false;
		}
		
		//Essa funcao tem como propósito exclusivamente resolver um problema com a lista de associacoes
		//TODO func getAtividades para associacoes funfar
		public static function getAtividades($idCurso){
			$strQuery = "SELECT * FROM atividades WHERE idCurso = '$idCurso'";
			if($resultado = BancoDados::query($strQuery)){
				return $resultado;
			}else{
				return null;
			}
		}
		
		public function getUltimaVersaoCorrigida($idAluno){
			return AtividadeVersao::getUltimaVersaoCorrigida($this->idAtividade, $idAluno);
		}
		
		public function getUltimaVersao($idAluno){
			return AtividadeVersao::getUltimaVersaoAluno($this->idAtividade, $idAluno);
		}
		
		public function salvaHoraInicio($idAluno){
			$strQuery = "INSERT INTO atividadetestehoraaluno VALUES(DEFAULT, '$this->idAtividade', '$idAluno', NOW());";
			$resultado = BancoDados::query($strQuery);
			return $resultado;
		}
	}
?>